#ifndef SOBJC_PROTO_H
#define SOBJC_PROTO_H

#include <sobjc-commons/list.h>
#include <sobjc/runtime.h>
#include <sobjc/class.h>

typedef struct objc_proto_ivar          *ProtoIvar;
typedef struct objc_proto_ivar_list     *ProtoIvarList;
typedef struct objc_proto_method        *ProtoMethod;
typedef struct objc_proto_method_list   *ProtoMethodList;

struct objc_proto_ivar {
  const char *name;
  size_t size;
  const char *type;
};

struct objc_proto_method {
  SEL name;
  IMP imp;
  const char *types;
  int dcode;
  BOOL is_private;
  BOOL is_sealed;
};

struct objc_proto_class {
  const char *name;
  const char *super_name;
  int nivars;
  struct objc_proto_ivar *ivars;
  int ninst_meths;
  struct objc_proto_method *inst_meths;
  int nclass_meths;
  struct objc_proto_method *class_meths;
  int ninst_dcodes;
  int nclass_dcodes;
};

#endif /* SOBJC_PROTO_H */
